﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Oya.Entities
{
    public abstract class MonstreBase
    {
        #region Propriete et Champs
        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        private string nom;

        public string Nom
        {
            get { return nom; }
            set { nom = value; }
        }
        private string surNom;

        public string SurNom
        {
            get { return surNom; }
            set { surNom = value; }
        }


        private MonstreType monstreType;

        private byte rarete;

        /// <summary>
        /// Represente la rarete du monstre.
        /// </summary><remarks>determinera sa frequence et possibilite d apparition dans l arene</remarks>
        public byte Rarete
        {
            get { return rarete; }
            set { rarete = value; }
        }

        private int nivXP;

        public int NivXP
        {
            get { return nivXP; }
            set { nivXP = value; }
        }

        private int pointsXP;

        /// <summary>
        /// Point d experience
        /// </summary><remarks>plus c est haut, plus il faut de XP pour gagner</remarks>
        public int PointsXP
        {
            get { return pointsXP; }
            set { pointsXP = value; }
        }


        private int energyLevel;

        public int EnergyLevel
        {
            get { return energyLevel; }
            set { energyLevel = value; }
        }



        public MonstreType MonstreType
        {

            get { return monstreType; }
            set { monstreType = value; }

        }


        private MonstreCaracteristiquesModel caracteristiquesBase;

        /// <summary>
        /// Represente les caracteristiques de base du monstre
        /// </summary>
        public MonstreCaracteristiquesModel CaracteristiquesBase
        {
            get { return caracteristiquesBase; }
            set { caracteristiquesBase = value; }

        }

        private MonstreCaracteristiquesModel caracteristiquesProgression;


        /// <summary>
        /// Represente la progression des caracteristiques a chaque niveau XP gagne
        /// </summary>
        public MonstreCaracteristiquesModel CaracteristiquesProgression
        {
            get { return caracteristiquesProgression; }
            set { caracteristiquesProgression = value; }

        }



        private MonstreCaracteristiquesActuelle caracteristiquesActuelle;

        /// <summary>
        /// Represente les caracteristiques actuelle.
        /// </summary><remarks> formule : CaracteristiquesBase + CaracteristiquesProgression * pointsXP</remarks>
        public MonstreCaracteristiquesActuelle CaracteristiquesActuelle
        {
            get
            {
                //initialisation initiale si jamais eu lieu
                if (caracteristiquesActuelle == null) caracteristiquesActuelle = new MonstreCaracteristiquesActuelle(CaracteristiquesBase, CaracteristiquesProgression);

                //met a jour les caracteristiques actuelle avant des les retourner.
                caracteristiquesActuelle.UpdateActualCaracteristiques(CaracteristiquesBase, caracteristiquesProgression, NivXP);

                return caracteristiquesActuelle;
            }
            set { caracteristiquesActuelle = value; }

        }


        #endregion


        #region Construction
        public MonstreBase()
        {
            /*appel la methode abstraite par les classes derivees qui doit definier les caracteristiques de base et progression */
            this.CaracteristiquesBase = DefinirMonstreCaracteristiqueBase();
            this.CaracteristiquesProgression = DefinirMonstreCaracteristiqueProgression();

        }

        #endregion

        #region Methodes abstraites que les monstres devrons implementer
        public abstract int Attack();
        public abstract int Defendre();

        /// <summary>
        /// Implementer dans les derivees pour definir propriete fixe
        /// </summary>
        /// <param name="Nom"></param>
        /// <param name="Id"></param>
        /// <param name="Rarete"></param>
        public abstract void InitialiserProprieteFixe(ref string Nom, ref int Id, ref int Rarete);

        /// <summary>
        /// Definir les caracteristiques de base du monstre.
        /// </summary>
        /// <returns></returns>
        public abstract MonstreCaracteristiquesModel DefinirMonstreCaracteristiqueBase();
        /// <summary>
        /// Definir les caracteristiques dans la progression du monstre.
        /// </summary>
        /// <returns></returns>
        public abstract MonstreCaracteristiquesModel DefinirMonstreCaracteristiqueProgression();

        #endregion
    }
}
